#!/usr/bin/env node

//recupero i moduli
var express = require('express');
var app = express();
var share   = require('share').server;
var options = require('./db/options');
var cr = require('./db/create');
var dl =  require('./db/delete');
var hbs = require('hbs');
var AWS = require('aws-sdk');

//creo la variabile per la wait 
var time = 42000;

//carico i dati per amazon
AWS.config.update({accessKeyId: options.db.amazon_access_key, secretAccessKey: options.db.amazon_secret_key, region: options.db.amazon_region});

//dichiaro le variabili per amazon
var db = new AWS.DynamoDB();
var s3 = new AWS.S3();

//creo la variabile redis se richiesto
if (options.db.type == 'redis'){
    var redis_client = require("redis").createClient(options.db.host, options.db.hostname, options.redisOptions);
    var keyForDoc;
    keyForDoc = function(docName) {
        return "" + options.db.prefix + "doc:" + docName;
    };
};

//configurazione di express()
app.configure(function(){
    app.set('view engine', 'html');
    app.engine('html', hbs.__express);
    app.set('views', __dirname + '/html');
    app.use(express.urlencoded());
    app.use(express.json());
    app.use(app.router);
    app.use(express.static(__dirname + '/html'));
});

/*Ogni volta che si apre la home page effettuo una ricerca dei documenti creati;
salvo i risultati dentro l'array Doclist e poi li faccio visualizzare
nella home linkati*/
app.get('/', function(req, res) {
    if (options.db.type == 'redis'){
        redis_client.keys("" + options.db.prefix + "doc:*",function(err, keys){
            if (err != null){
                console.log(err);
            }
            else {
                DocList = new Array();
                for(var i = 0, len = keys.length; i < len; i++) {
                    var file = keys[i];
                    var name = file.replace('ShareJS:doc:','');
                    DocList[i] = name;
                };
                res.render('index',{documents:DocList});
            }
        });
    }
    else {
        s3.listObjects({
            Bucket: options.db.amazon_s3_snapshots_bucket_name
        }, function(err, data) {
            DocList = new Array();
            
            for (i = 0; i < data.Contents.length; i++) {
                var file = data.Contents[i].Key;
                var name = file.substr(0, (file.indexOf('/')) );
                DocList[i] = name;
            }
            res.render('index',{documents:DocList});
        });
    }    
});

/*Alla richiesta della pagina editor.html il server effettua tutte le operazioni necessarie per lanciare o meno l'editor */
app.get('/editor.html', function(req, res){
    var titolo = req.query.titolo;
    console.warn('titolo = '+titolo)
    if (titolo == "" || titolo == "{{nome}}" || titolo == null || titolo.search(/null/i) != -1 || titolo == undefined || titolo.search(/[\/\,\*\._\\\|\[\]{}\s+\@\#\$\^\&\'\"\(\)\:]/) != -1 || titolo.length > 245) {
        res.redirect('/error.html');
    } 
    else {
        if (options.db.type == 'amazon'){
            var AmEditor = require('./db/amazon');
            AmEditor.amazon(db, options, titolo, time, cr, function(){
                res.render('editor',{nome:titolo});
            }); 
        }
        else if (options.db.type == 'amazon_redis'){
            var Am_ReEditor = require('./db/amazon_redis');
            Am_ReEditor.amazon_redis(db, options, titolo, time, cr, function(page){
                console.warn(page);
                res.render(page,{nome:titolo});
            });
        }
        else if (options.db.type == 'redis'){
            res.render('editor',{nome:titolo});
        }
        else {
            console.log('Tipo di db non supportato');
        }
    }
});

/*Operazioni necessarie per cancellare un documento du s3 e le relative tabelle su dynamo db */
app.post('/delete.html', function(req, res){
    var titolo = req.body.titolo;
    if (options.db.type == 'amazon'){
        dl.cancella(db, s3, titolo, options, function(){
            res.render('delete');
        });
    }
    else if (options.db.type == 'amazon_redis'){
        dl.cancella_r(db, s3, titolo, options, time, function(page){
            if (page == 'not-now') {
                res.render(page, {nome:titolo});
            }
            else {
                res.render('delete');
            }
        });
    }
    else if (options.db.type == 'redis'){
        res.render('delete');
    }
    else {
       console.log('Tipo di db non supportato'); 
    }
});

/*Operazioni inerenti all'apertura della pagina di errore */
app.get('/error.html', function(req, res) {
    res.render('error');
});

/*Richiesta di un export di un determinato file */
app.get('/export', function(req, res) {
    var file = req.query.file
    if (options.db.type == 'amazon' || options.db.type == 'amazon_redis'){ 
        s3.getObject({
            Bucket: options.db.amazon_s3_snapshots_bucket_name,
            Key: file+'/'+file+'.zip'
        }, function(err, data) {
            if (err != null){
                console.log(err);
            }
            else {
                res.setHeader('content-disposition', 'form-data; name="filename"; filename="'+file+'.zip"');
                console.log(data.Body);
                res.send(data.Body);
            }
        });
    }
    else if (options.db.type == 'redis'){
        redis_client.get(keyForDoc(file),function(err, response){
            parse = JSON.parse(response);
            console.log(parse.snapshot);
            res.setHeader('content-disposition', 'form-data; name="filename"; filename="'+file+'.txt"');
            res.send(parse.snapshot);
        });
    }    
});

//attacco share al server 
share.attach(app, options);

//lancio il server sulla porta 9000
app.listen(9000);
console.warn('Server running at http://localhost:9000/');